﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using BE;
using DAL;
using BE.SearchCriteria;
using BLL.Exceptions;

namespace BLL
{
    public class PedidoBLL : BaseBLL
    {
        public static void InsertarPedido(PedidoBE pPedido)
        {
            try
            {
                Validar(pPedido);

                PedidoDAL oPedidoDAL = new PedidoDAL();
                PedidoArticuloDAL oPedidoArticuloDAL = new PedidoArticuloDAL();

                PedidoBLL.CalcularTotales(pPedido);

                oPedidoDAL.InsertarPedido(pPedido);

                foreach (PedidoArticuloBE wListItem in pPedido.ListPedidoArticulo)
                {
                    wListItem.IdPedido = pPedido.IdPedido;
                    oPedidoArticuloDAL.InsertarPedidoArticulo(wListItem);
                }
            }
            catch (Exception ex)
            {
                if (!HandleException(ex))
                    throw;
            }
        }

        public static List<PedidoBE> SeleccionarTodos(BaseSC pFiltroSC, int pPageSize, int? pPageNum, ref int pCountReg)
        {
            PedidoDAL oPedidoDAL = new PedidoDAL();
            return oPedidoDAL.SeleccionarPorParametros(pFiltroSC, pPageSize, pPageNum, ref pCountReg);
        }

        public static PedidoBE SeleccionarPorId(PedidoBE pPedidoBE)
        {
            Int32 wCountReg = 0;
            PedidoBE oPedidoBE = null; 
            PedidoDAL oPedidoDAL = new PedidoDAL();
            oPedidoBE = oPedidoDAL.SeleccionarPorId(pPedidoBE);

            VendedorDAL oVendedorDAL = new VendedorDAL();
            VendedorBE oVendedorBE = oVendedorDAL.SeleccionarPorId(oPedidoBE.pVendedorBE);
            if (oVendedorBE != null)
                oPedidoBE.pVendedorBE = oVendedorBE;

             PedidoArticuloDAL oPedidoArticuloDAL = new PedidoArticuloDAL();  
             PedidoArticuloSC oPedidoArticuloSC = new PedidoArticuloSC();
             oPedidoArticuloSC.IdPedido = oPedidoBE.IdPedido;
             oPedidoBE.ListPedidoArticulo = oPedidoArticuloDAL.SeleccionarPorParametros(oPedidoArticuloSC, 0, null, ref wCountReg);

             return oPedidoBE;
        }

        public static void Modificar(PedidoBE pElemBE)
        {
            try
            {
                Validar(pElemBE);

                PedidoArticuloDAL oPedidoArticuloDAL = new PedidoArticuloDAL();
                PedidoDAL oPedidoDAL = new PedidoDAL();

                PedidoBLL.CalcularTotales(pElemBE);
                oPedidoDAL.ModificarPedido(pElemBE);
                pElemBE.ListPedidoArticulo.ForEach(x => x.IdPedido  = pElemBE.IdPedido); //se setea el idPedidoArticulo por las dudas le falte a alguno

                oPedidoArticuloDAL.DeleteByIdPedidoArticulo(pElemBE.IdPedido);
                oPedidoArticuloDAL.InsertarPedidoArticuloList(pElemBE.ListPedidoArticulo);

            }
            catch (Exception ex)
            {
                if (!HandleException(ex))
                    throw;
            }
        }

        public static void CalcularTotales(PedidoBE pPedidoBE)
        {
            pPedidoBE.CantidadArticulos = pPedidoBE.ListPedidoArticulo.Sum(x => x.Cantidad);
            pPedidoBE.Importe = pPedidoBE.ListPedidoArticulo.Sum(x => x.PrecioUnitario * x.Cantidad);
        }


        private static void Validar(PedidoBE pElemBE)
        {
            if (pElemBE.ListPedidoArticulo.Count == 0)
                throw new BLLException("Debe ingresar por lo menos un artículo.");

        }

           
    }
}
